package com.wms.ymcc.result;

import com.wms.ymcc.constant.GlobalExceptionConstants;
import lombok.Builder;
import lombok.Data;

/**
 * @author : 阿盛哟
 * @description : 通用的 JSON 响应结果封装类，用于统一返回给前端的响应格式。
 *                包含操作是否成功、错误信息、错误码以及返回的数据。
 * @createDate : 2025/5/28 21:00
 */
//返回JSON结果
@Data
public class JSONResult {

    /**
     * 操作是否成功标识，默认为 true。
     */
    private boolean success = true;


    /**
     * 响应消息内容，默认值为 "成功"。
     */
    private String message = "成功";

    /**
     * 错误码，用来描述错误类型，默认值为 "20000"（表示没有错误）。
     */
    private String code = "20000";

    /**
     * 返回给前端的具体数据对象，可以是 null 或任意类型。
     */
    private Object data;

    /**
     * 创建一个成功的响应实例，无返回数据。
     * 默认：success=true, message=成功, code=20000
     *
     * @return JSONResult 实例
     */
    public static JSONResult success(){
        return new JSONResult();
    }

    /**
     * 创建一个成功的响应实例，并携带返回数据。
     *
     * @param obj 返回的数据对象
     * @return JSONResult 实例
     */
    public static JSONResult success(Object obj){
        JSONResult instance = new JSONResult();
        instance.setData(obj);
        return instance;
    }

    /**
     * 创建一个成功的响应实例，携带自定义状态码和返回数据。
     *
     * @param obj  返回的数据对象
     * @param code 自定义状态码
     * @return JSONResult 实例
     */
    public static JSONResult success(Object obj,String code){
        JSONResult instance = new JSONResult();
        instance.setCode(code);
        instance.setData(obj);
        return instance;
    }

    /**
     * 创建一个失败的响应实例，手动指定错误信息和错误码。
     *
     * @param message 错误信息
     * @param code    错误码
     * @return JSONResult 实例
     */
    public static JSONResult error(String message,String code){
        JSONResult instance = new JSONResult();
        instance.setMessage(message);
        instance.setSuccess(false);
        instance.setCode(code);
        return instance;
    }


    /**
     * 创建一个失败的响应实例，不带具体错误信息。
     * 默认：success=false, message=null, code=null
     *
     * @return JSONResult 实例
     */
    public static JSONResult error(){
        JSONResult jsonResult = new JSONResult();
        jsonResult.setSuccess(false);
        return jsonResult;
    }

    /**
     * 创建一个失败的响应实例，仅指定错误信息，错误码默认为 null。
     *
     * @param message 错误信息
     * @return JSONResult 实例
     */
    public static JSONResult error(String message){
        return error(message,null);
    }

    /**
     * 使用全局异常常量创建失败响应。
     * 通过传入 GlobalExceptionConstants 枚举自动获取 message 和 code。
     *
     * @param globalExceptionConstants 全局异常枚举常量
     * @return JSONResult 实例
     */
    public static JSONResult error(GlobalExceptionConstants globalExceptionConstants){
        return error(globalExceptionConstants.getMessage(),globalExceptionConstants.getCode());
    }

}
